package com.maxmlr.music.common.config;

import java.lang.reflect.Method;
import java.util.Objects;

import com.maxmlr.music.common.bean.ResultBean;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.aspectj.lang.reflect.MethodSignature;
import org.springframework.aop.aspectj.MethodInvocationProceedingJoinPoint;
import org.springframework.stereotype.Component;

import com.maxmlr.music.common.param.SimpleReqDTO;
import com.maxmlr.music.common.annotation.RequestValid;
import com.maxmlr.music.common.enums.ErrorCode;

/**
 * @author max
 * @version 1.0
 * @Package com.maxmlr.music.common.config
 * @ClassName ParaCheckAspect
 * @Description 初始化接口参数非空判断切面类
 * @Copyright Copyright (c) 2018: www.maxmlr.com.
 * @since 2018年12月15日 下午5:31:54
 */
@Aspect
@Component
public class RequestValidAspect {

    @Pointcut("@annotation(com.maxmlr.music.common.annotation.RequestValid)")
    private void paramsAspect() {
    } // 声明一个切入点，anyMethod为切入点名称

    /**
     * @param point
     * @return
     * @throws Throwable
     * @Title around
     * @Description 初始化接口参数非空判断
     * @author max
     * @since 2018年12月16日 下午2:38:11
     */
    @Around("paramsAspect()")
    public Object around(ProceedingJoinPoint point) throws Throwable {
        // 获取注解方法请求参数
        Object[] obj = point.getArgs();
        SimpleReqDTO req = (SimpleReqDTO) obj[0];
        // 获取被注解的方法
        MethodInvocationProceedingJoinPoint mPoint = (MethodInvocationProceedingJoinPoint) point;
        MethodSignature signature = (MethodSignature) mPoint.getSignature();
        Method method = signature.getMethod();
        // 获取注解
        RequestValid valid = method.getAnnotation(RequestValid.class);
        // 获取校验参数
        String[] params = valid.params();
        if (Objects.isNull(params) || params.length == 0) {
            return ResultBean.error(ErrorCode.PARAMS_VALID_ERROR);
        }
        for (String param : params) {
            if (req.getParams().get(param) == null || "".equals(req.getParams().get(param).toString().trim())) {
                return ResultBean.error(ErrorCode.PARAMS_NULL_ERROR, new Object[]{param});
            }
        }
        // 通过，继续下一个方法
        return point.proceed();
    }

}
